The purpose of this exercise is to teach methods of creating point data for display in various programs. These skills will help you understand the foundation of point data, creation of new point datasets, and editing attribute tables.

1 The Introduction

A recent survey was sent to new students at APSU to determine what information they felt was missing in their new student orientation packets. One of the most common responses was that while there is enough dining options on campus, the students were not always aware of where certain options were located. Additionally, students were also interested in dining options were located close to campus. So the APSU Dining Services director has asked you to develop a map specific to dining locations in and around campus. On this map the director would like to see the name of each point, a way to determine if it is part of Dining Services or an off-campus location (think about symbology), and some method of listing their hours of operation. They provided a list of campus dining locations and convenience stores here. Off campus dining should be within walking distance (~1mi). A dataset for this has been developed by obtaining location information from other sources. However, if there is missing information from this list you should feel free to append the data.

In this exercise you will:

  • Learn to create point data
  • Work with external datasets that contain x,y data
  • Edit and add information to the attribute table
  • Optionally work to:
    • Develop multi-part symbology
    • Add tables to a map

Software specific directions can be found for each step below. Please submit the answer to the questions and your final map by the due date.

1.1 Step One: The Data

You will need to use aerial imagery for this exercise in order to identify the dining locations on and off campus. The information contained in the link in the introduction should provide you all of the basic information. Adding Montgomery County or the county/state datasets for Tennessee from previous exercises might help to provide location information but is not necessarily required.

View Directions in ArcGIS Pro

Blah…blah…blah…

Question No. 1
Insert Text Here

View directions in QGIS

In Exercise 4, Step 2 you added a remote connection to satellite imagery using the XYZ Tiles of the Browser Pane. Because this exercise will rely heavily on having accessible imagery you will begin by adding several other remote connections. This way you have options as to which imagery works best for this exercise. Remember in Exercise 4 you needed to right/CRTL-click on XYZ Tiles and add a “New Connection”. Below is the URLs you need to use for each connection:

Service Provider URL Appx. Max Scale
Satellite Imagery Bing http://ecn.t3.tiles.virtualearth.net/tiles/a{q}.jpeg?g=1 1:1
Satellite Imagery ESRI https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x} 1:1
Street Map OpenStreetMap https://tile.openstreetmap.org/{z}/{x}/{y}.png 1:1
Topographic Map OpenStreetMap https://tile.opentopomap.org/{z}/{x}/{y}.png 1:3400

You will be using one of the services above to locate the on and off-campus dining locations so take some time to add each one to your layers and examine the area surrounding campus. It is up to you to choose which type of imagery is best used for the data creation as well as the final map for this assignment.

Once you have selected the imagery you plan to use, click Layer > Create Layer > New Shapefile Layer to create a new shapefile dataset. In the resulting window, click on the browse button Browse for file location to give your shapefile a new name and save it in your project folder.

New Shapefile Layer

For the rest of the options use the following settings:

  • File encoding = UTF-8
  • Geometry type = Point
  • Additional dimensions = None, EPSG:4326 - WGS 84
  • New Field
    • Name = Name
    • Type = TextData
    • Length = 80

New Shapefile Layer Box

Because you will be creating a series of points the geometry should be set to point. However, you would take these same steps to create a multipoint, line, or polygon shapefile as well. The UTF-8 encoding allows for the dataset to be used on Windows of Mac OS systems which enables the possibility of sharing the data. After adding the information for the New Field click the button to Add to Fields List to add a field called “Name” to your dataset and click OK.

This will create a new dataset in your layers that allows you to add additional point information. With the new dataset selected, begin by either right/CRTL clicking on the new data layer or clicking the pencil icon Toggle Editing to Toggle Editing. This will make the new layer editable. Next, click on the Add Point Feature button Add Point Feature and notice as your cursor becomes a target.

Adding Point Data

Place the target over the Woodward Library building roughly where the Starbucks is located and click. In the resulting window give this location attributes where the id = 1 and the Name = Starbucks and click OK. You will notice a new point that appears on the map and your cursor will return to a target like appearance. This created point data representing Starbucks and is uniquely identified by the ID and Name variables. Repeat this process and create points for all of the on-campus dining locations and convenience stores (~12). For the ID field continue to increase the number by one each time and for the Name field type in the name of the location you are depicting. When you have finished the last data point, click the Save Layer Edits button Save Layer Edits and toggle editing for that layer off by clicking the toggle button Toggle Editing.

With the on-campus locations created you could also use the same steps to create the off-campus location. However, sometimes you will find that collaborators send you information in the form of a spreadsheet or some other format such as keyhole markup langauge (KML) from Google Earth or a KMZ which is a compressed version of a KML. In Exercise 5, Step 2 you learned how to import a *.csv file without geometry (meaning there were no X and Y values for locations). If the *.csv file has variables for a location, such as longitude and latitude or UTM, you can simply choose “Point Coordinate” and provide the fields where the XY data is located. However, with a useful QGIS plug-in you have the ability to import some data directly from a URL depending on the format. Similar to Exercise 5, Step 4, go to Plugins > Manage and Install Plugins on the menu bar and search for MMQGIS and install the plug-in.

MMQGIS

On the menu bar you will see a new option for MMQGIS available. Click MMQGIS > Import/Export > Geometry Import from CSV File and in the resulting window use the following options and click apply:

Importing CSV File with MMQGIS

The resulting import should have placed another 24 data points on your map. You can use right/CRTL click and “Zoom to Layer” on the new layer to see all of the new points (colors my vary).

Imported CSV Points

Question No. 1
Which on-campus location is the last to close on a Saturday night? What other variables were included in the off-campus points that weren’t included in the on-campus data you created?

View directions in R

Before you begin, you will need to open the Ex2 Colab Notebook and insert tocolab after github in the URL to open in the Colab Environment. As you have seen before, R requires various packages to complete certain analyses. In this exercise you will be using tidyverse, OpenStreetMaps, ggfortify, maptools, and rgeos. To install and load the packages we will use the following script:

Blah…blah…blah…

Question No. 1
Insert Text Here

1.2 Step Two: The Analyses

With datasets for both on-campus and off-campus created, in this step you will edit the attribute table to provide options for categorizations when making the final map.

View Directions in ArcGIS Pro

Blah…blah…blah…

Question No. 2
Insert Text Here

View Directions in QGIS

Now that you have your two datasets it makes sense to merge them into one combined file. In the Processing Toolbox or in Vector > Data Management Tools > Merge Vecor Layers on the menu bar, open the processing tool to create a merged dataset.

Merge Vector Layers

In the Merge Vector Layers dialog box click browse button Browse for file location to select the input layers. Using the select all button or by checking the boxes next to each layer, select the on and off campus datasets and click the Go Back button Go Back Button to return to the main merge menu. To save the dataset as a permanent file click the browse button Browse for file location in the Merged option and select “Save to File…” Remember to save it in your project folder.

With the newly merged dataset added to your layers, open the attribute table to examine the output.

Merge Vector Layer Attribute Table

Notice that the variables from each dataset are now included in the full table. However, because each attribute table had varying data some of the cells are filled will NULL values. To edit these values click on the toggle editing button Toggle Editing on the attribute table and you will be able to click within each NULL value cell and edit the information. For this exercise focus on completing the ID (simply number them 1-36), location (off-campus or on-campus), hours, and hours_cate (short for category) columns. The X and Y columns are completed for the off-campus locations because the information was included in the initial *.csv file. When you created the on-campus locations that data is not specifically recorded in the attribute table. So don’t worry about adding that information into the table as it is very unlikely it will be useful for the visualization.

If you are interested in creating an additional field to provide further data about the locations (type of food, dining atmosphere, etc.) you can click the New Field button while editing is toggled on in the attribute table to make a new field. In the window give the field a name, type such as integer, decimal, text, date, etc., length which is the number of “characters” for any non text or integer value, and/or precision which is the number of places to the right of the decimal. Think about categories you can create that might be useful in your visualization.

Question No. 2
Based on date in the attribute table, how many locations would not be an option at 3pm this afternoon?

View Directions in R

Blah…blah…blah…

Question No. 2
Insert Text Here

1.3 Step Three: The Visualization

In this step you will use previous examples and your own design concepts to create a visualization that can be distributed by APSU Dining Services to students as part of their “Welcome to Campus” packet when they arrive in the fall. You may need to use various inset maps or other methods to ensure all locations can be viewed.

View directions in ArcGIS Pro

Blah…blah…blah…

Question No. 3
Insert Text Here

View directions in QGIS

Unlike previous exercises, there will not be an example provided of how this map could be made. Because there is a large number and variety of data points you will need to think about how to create the most useful visualization possible for dining services. However, in Exercise 4, Step 4 you used a more advanced labeling feature to filter out and add labels to specific locations to the map. This process skipped over the basic steps for labeling data. While you could use the more advance rule-based labeling for this, here is how you produce basic labels for a given dataset.

Right/CRTL click on the dataset you wish to label can select the properties menu. Navigate to the Labels tab on the left and select Single Labels from the drop-down menu at the top of the window.

Single Labels

This will provide a number of options for label customizations once you select the Value or the field you want to be used for the labels. In this case you want to select name. Now you can move through the various options on the left such as text, formatting, buffer, mask, background, shadow, etc. to design a style of labeling that is appropriate for display on your map.

One last option for this visualization is to change the opacity of the background imagery. Depending on the background that was selected, the intensity or variation in the color or texture can make it difficult to visualize some overlays. By right/CRTL clicking on the background imagery layer and selecting Transparency you can change the Global Opacity value to adjust how the layer is displayed. This might help with the legibility of the labels.

Because of the difficulties with label organization on various maps, some cartographers prefer to manually label items so their precise positioning can be controlled better than if placed by the software.

Question No. 3
By changing the labeling options, describe the difference between what mask and buffer do.

View directions in R

Blah…blah…blah…

Question No. 3
Insert Text Here

1.4 Step Four: Culinary Cartography

After reviewing the information you have collected with the APSU Dining Services Director, they have given you full control of the final design of the map but asked that you include and APSU logo on the map. To download official logos for the university you must go do http://aspire.apsu.edu and click the login link in the upper right corner. Using the APSU Login link, enter your OneStop username/password and click login. On the ASPIRE Homepage click the link for Public Relations and Marketing under the Communities heading in the center of the page. Under “Recent Submissions” you will find a number of different logos to choose from. Select the one you would like to use and click on the link. Finally select either the JPEG or PNG version of the logo and right/CRTL click on the corresponding view/open link to download to your project folder. Once you have the logo you can log out.

View directions in ArcGIS Pro

Blah…blah…blah…

Question No. 4
Insert Text Here

View directions in QGIS

Although the final design of the dining map will be up to you, there are a couple techniques which might be helpful in trying to visually organize the data on the layout screen. In Exercise 4, Step 3 you learned how to create an inset map that provided a small scale view of the dataset. Insets can also be used to view clustered data in a large scale view. For example, in the sample images above you can see a few distinct dining clusters that could be placed in a larger scale inset to provide additional legibility. Following similar steps to Exercise 4, Step 3 you can create an inset for the locations along University Ave. In this case, because the inset is at a larger scale than the primary map, you can have QGIS create an overview to highlight the inset location.

After creating the large scale inset on your layout, right/CRTL click on the primary map and select Item Properties. Scroll down to Overviews and click the drop-down arrow.

Creating Overviews

With Overview open, click the green plus button and select your map inset map. With the draw overview box checked you should see a highlighted area on the primary map of where the inset is located.

Overview Map Styling

If you were to create multiple overviews you could simply add some identifying text like a capital letter A in matching boxes and B in the second boxes or create some other way to identify which inset connects to which area.

Additionally, there are times you may want to add a table to your map. Suppose you would want to add the attribute table information to the inset you just created to use the IDs as the location indicators and allow the users to scan the table for specific information. This can be accomplished by clicking the Add attribute table button Add attribute table in the layout and drawing a square on the map. Once loaded the entire attribute table will overwhelm the map. However, this can be adjusted by selecting the attribute table and opening the item properties.

With the Source set as “Layer Features” and the Layer set as the merged dataset you created above you should be able to click the Attributes… to open a Select Attributes window. Using the up, down, add, and remove boxes you can select the data you would like to remove from the map table or add additional rows. Next you need to click the box for “Show only features visible within a map” and select your inset in the linked map options.

Add Table

Once you have the data linked, you can scroll down and adjust all of the options to format the table to fit your design before closing the item properties.

Table Styling

While tables are not required and should be used sparingly, they can be used to help provide additional information regarding the data that cannot be displayed through labels. However, there are always ways to create symbology that can hold multiple attributes simultaneously as discussed in lecture.

Finally, to add the APSU logo to your layout, click the Add Picture button Add picture and draw a square on the map to place the object. Open the item properties to make any necessary adjustments.

Question No. 4
On a map with the primary as large scale and the inset as small scale which map would you select to set the overview?

View directions in R

Blah…blah…blah…

Question No. 4
Insert Text Here

2 The Write-Up

In the presentation of the map you provide to the APSU Dining Services Director please provide the following information:

  • Discuss the challenges you encountered mapping the data.
  • Describe what information that was not immediately available (if any) that could have helped you create a better product.

When complete, send a link to your Colab Notebook or word document with answers to Questions 1-4, the write-up, and your completed map via email.

LS0tDQp0aXRsZTogIkV4ZXJjaXNlIDY6IENyZWF0aW5nIFBvaW50IERhdGEgPGJyPjxzbWFsbD5HZW9ncmFwaGljIEluZm9ybWF0aW9uIFN5c3RlbXMgMSBMYWI8L3NtYWxsPjwvYnI+Ig0KYXV0aG9yOiAiR0VPRyAzMTUwIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KZWRpdG9yX29wdGlvbnM6DQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCiAgbW9kZTogZ2ZtDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDQwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQouem9vbSB7DQogIHRyYW5zZm9ybS1vcmlnaW46IDQwJSA1MCUgMDsNCiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4yczsNCiAgbWFyZ2luOiAwIGF1dG87DQp9DQouem9vbSBpbWd7DQoJd2lkdGg6YXV0bzsNCgloZWlnaHQ6YXV0bzsJDQp9DQouem9vbTpob3ZlciB7DQogIHRyYW5zZm9ybTogc2NhbGUoMik7DQp9DQoNCnRoLCB0ZCB7cGFkZGluZzogNXB4O30NCg0KPC9zdHlsZT4NCmBgYA0KPGhyPjwvaHI+DQoNClRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdGVhY2ggbWV0aG9kcyBvZiBjcmVhdGluZyBwb2ludCBkYXRhIGZvciBkaXNwbGF5IGluIHZhcmlvdXMgcHJvZ3JhbXMuIFRoZXNlIHNraWxscyB3aWxsIGhlbHAgeW91IHVuZGVyc3RhbmQgdGhlIGZvdW5kYXRpb24gb2YgcG9pbnQgZGF0YSwgY3JlYXRpb24gb2YgbmV3IHBvaW50IGRhdGFzZXRzLCBhbmQgZWRpdGluZyBhdHRyaWJ1dGUgdGFibGVzLg0KDQojIFRoZSBJbnRyb2R1Y3Rpb24NCg0KQSByZWNlbnQgc3VydmV5IHdhcyBzZW50IHRvIG5ldyBzdHVkZW50cyBhdCBBUFNVIHRvIGRldGVybWluZSB3aGF0IGluZm9ybWF0aW9uIHRoZXkgZmVsdCB3YXMgbWlzc2luZyBpbiB0aGVpciBuZXcgc3R1ZGVudCBvcmllbnRhdGlvbiBwYWNrZXRzLiBPbmUgb2YgdGhlIG1vc3QgY29tbW9uIHJlc3BvbnNlcyB3YXMgdGhhdCB3aGlsZSB0aGVyZSBpcyBlbm91Z2ggZGluaW5nIG9wdGlvbnMgb24gY2FtcHVzLCB0aGUgc3R1ZGVudHMgd2VyZSBub3QgYWx3YXlzIGF3YXJlIG9mIHdoZXJlIGNlcnRhaW4gb3B0aW9ucyB3ZXJlIGxvY2F0ZWQuIEFkZGl0aW9uYWxseSwgc3R1ZGVudHMgd2VyZSBhbHNvIGludGVyZXN0ZWQgaW4gZGluaW5nIG9wdGlvbnMgd2VyZSBsb2NhdGVkIGNsb3NlIHRvIGNhbXB1cy4gU28gdGhlIFtBUFNVIERpbmluZyBTZXJ2aWNlc10oaHR0cHM6Ly93d3cuYXBzdS5lZHUvZGluaW5nL2luZGV4LnBocCkgZGlyZWN0b3IgaGFzIGFza2VkIHlvdSB0byBkZXZlbG9wIGEgbWFwIHNwZWNpZmljIHRvIGRpbmluZyBsb2NhdGlvbnMgaW4gYW5kIGFyb3VuZCBjYW1wdXMuIE9uIHRoaXMgbWFwIHRoZSBkaXJlY3RvciB3b3VsZCBsaWtlIHRvIHNlZSB0aGUgbmFtZSBvZiBlYWNoIHBvaW50LCBhIHdheSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgcGFydCBvZiBEaW5pbmcgU2VydmljZXMgb3IgYW4gb2ZmLWNhbXB1cyBsb2NhdGlvbiAodGhpbmsgYWJvdXQgc3ltYm9sb2d5KSwgYW5kIHNvbWUgbWV0aG9kIG9mIGxpc3RpbmcgdGhlaXIgaG91cnMgb2Ygb3BlcmF0aW9uLiBUaGV5IHByb3ZpZGVkIGEgbGlzdCBvZiBjYW1wdXMgZGluaW5nIGxvY2F0aW9ucyBhbmQgY29udmVuaWVuY2Ugc3RvcmVzIFtoZXJlXShodHRwczovL2RpbmVvbmNhbXB1cy5jb20vYXBzdS9ob3Vycy1vZi1vcGVyYXRpb24pLiBPZmYgY2FtcHVzIGRpbmluZyBzaG91bGQgYmUgd2l0aGluIHdhbGtpbmcgZGlzdGFuY2UgKH4xbWkpLiBBIGRhdGFzZXQgZm9yIHRoaXMgaGFzIGJlZW4gZGV2ZWxvcGVkIGJ5IG9idGFpbmluZyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIFtvdGhlciBzb3VyY2VzXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9ybHo9MUMxR0NFVV9lblVTODgwVVM4ODAmdGJzPWxmOjEsbGZfdWk6OSZ0Ym09bGNsJnN4c3JmPUFPYWVtdklqTEV3MTFUaTZ5VmtwTzJieW5BT2hobHNRTUE6MTYzMTgxMTYwOTM5NSZxPWRpbmluZytuZWFyK21lJnJmbGZxPTEmbnVtPTEwJnZlZD0yYWhVS0V3ak9zOFg2LTRQekFoV21TUEVESFU3dkNqVVF0Z042QkFnTUVBYyNybGZpPWhkOjtzaTo7bXY6W1szNi41NDMzMzY1NTI3ODIxMSwtODcuMzMzMjE2ODExNzY3NzFdLFszNi41MTc5NTYyMjk4MTk0MjYsLTg3LjM3MDEyNDAwNzgxMjYzXSxudWxsLFszNi41MzA2NDc0MzIzNjIwNDUsLTg3LjM1MTY3MDQwOTc5MDE3XSwxNV0pLiBIb3dldmVyLCBpZiB0aGVyZSBpcyBtaXNzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhpcyBsaXN0IHlvdSBzaG91bGQgZmVlbCBmcmVlIHRvIGFwcGVuZCB0aGUgZGF0YS4NCg0KSW4gdGhpcyBleGVyY2lzZSB5b3Ugd2lsbDoNCg0KLSAgIExlYXJuIHRvIGNyZWF0ZSBwb2ludCBkYXRhDQotICAgV29yayB3aXRoIGV4dGVybmFsIGRhdGFzZXRzIHRoYXQgY29udGFpbiB4LHkgZGF0YQ0KLSAgIEVkaXQgYW5kIGFkZCBpbmZvcm1hdGlvbiB0byB0aGUgYXR0cmlidXRlIHRhYmxlDQotICAgT3B0aW9uYWxseSB3b3JrIHRvOg0KICAgIC0gICBEZXZlbG9wIG11bHRpLXBhcnQgc3ltYm9sb2d5DQogICAgLSAgIEFkZCB0YWJsZXMgdG8gYSBtYXANCg0KU29mdHdhcmUgc3BlY2lmaWMgZGlyZWN0aW9ucyBjYW4gYmUgZm91bmQgZm9yIGVhY2ggc3RlcCBiZWxvdy4gUGxlYXNlIHN1Ym1pdCB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbnMgYW5kIHlvdXIgZmluYWwgbWFwIGJ5IHRoZSBkdWUgZGF0ZS4NCg0KIyMgU3RlcCBPbmU6IFRoZSBEYXRhDQoNCllvdSB3aWxsIG5lZWQgdG8gdXNlIGFlcmlhbCBpbWFnZXJ5IGZvciB0aGlzIGV4ZXJjaXNlIGluIG9yZGVyIHRvIGlkZW50aWZ5IHRoZSBkaW5pbmcgbG9jYXRpb25zIG9uIGFuZCBvZmYgY2FtcHVzLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBsaW5rIGluIHRoZSBpbnRyb2R1Y3Rpb24gc2hvdWxkIHByb3ZpZGUgeW91IGFsbCBvZiB0aGUgYmFzaWMgaW5mb3JtYXRpb24uIEFkZGluZyBNb250Z29tZXJ5IENvdW50eSBvciB0aGUgY291bnR5L3N0YXRlIGRhdGFzZXRzIGZvciBUZW5uZXNzZWUgZnJvbSBwcmV2aW91cyBleGVyY2lzZXMgbWlnaHQgaGVscCB0byBwcm92aWRlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgcmVxdWlyZWQuIA0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMTwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiAjMDA2NDAwIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KSW4gW0V4ZXJjaXNlIDQsIFN0ZXAgMl0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTJfU3RlcF9Ud286X1RoZV9BbmFseXNlcykgeW91IGFkZGVkIGEgcmVtb3RlIGNvbm5lY3Rpb24gdG8gc2F0ZWxsaXRlIGltYWdlcnkgdXNpbmcgdGhlICoqWFlaIFRpbGVzKiogb2YgdGhlIF9Ccm93c2VyIFBhbmVfLiBCZWNhdXNlIHRoaXMgZXhlcmNpc2Ugd2lsbCByZWx5IGhlYXZpbHkgb24gaGF2aW5nIGFjY2Vzc2libGUgaW1hZ2VyeSB5b3Ugd2lsbCBiZWdpbiBieSBhZGRpbmcgc2V2ZXJhbCBvdGhlciByZW1vdGUgY29ubmVjdGlvbnMuIFRoaXMgd2F5IHlvdSBoYXZlIG9wdGlvbnMgYXMgdG8gd2hpY2ggaW1hZ2VyeSB3b3JrcyBiZXN0IGZvciB0aGlzIGV4ZXJjaXNlLiBSZW1lbWJlciBpbiBbRXhlcmNpc2UgNF0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTJfU3RlcF9Ud286X1RoZV9BbmFseXNlcykgeW91IG5lZWRlZCB0byByaWdodC9DUlRMLWNsaWNrIG9uICoqWFlaIFRpbGVzKiogYW5kIGFkZCBhICJOZXcgQ29ubmVjdGlvbiIuIEJlbG93IGlzIHRoZSBVUkxzIHlvdSBuZWVkIHRvIHVzZSBmb3IgZWFjaCBjb25uZWN0aW9uOg0KDQp8ICoqU2VydmljZSoqIHwgKipQcm92aWRlcioqIHwgKipVUkwqKiB8ICoqQXBweC4gTWF4IFNjYWxlKiogfA0KfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgIA0KfCBTYXRlbGxpdGUgSW1hZ2VyeSB8IEJpbmcgfCBodHRwOi8vZWNuLnQzLnRpbGVzLnZpcnR1YWxlYXJ0aC5uZXQvdGlsZXMvYXtxfS5qcGVnP2c9MSB8IDE6MSB8DQp8IFNhdGVsbGl0ZSBJbWFnZXJ5IHwgRVNSSSB8IGh0dHBzOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSB8IDE6MSB8DQp8IFN0cmVldCBNYXAgfCBbT3BlblN0cmVldE1hcF0oaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvKSB8IGh0dHBzOi8vdGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcgfCAxOjEgfA0KfCBUb3BvZ3JhcGhpYyBNYXAgfCBbT3BlblN0cmVldE1hcF0oaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvKSB8IGh0dHBzOi8vdGlsZS5vcGVudG9wb21hcC5vcmcve3p9L3t4fS97eX0ucG5nIHwgMTozNDAwIHwNCg0KWW91IHdpbGwgYmUgdXNpbmcgb25lIG9mIHRoZSBzZXJ2aWNlcyBhYm92ZSB0byBsb2NhdGUgdGhlIG9uIGFuZCBvZmYtY2FtcHVzIGRpbmluZyBsb2NhdGlvbnMgc28gdGFrZSBzb21lIHRpbWUgdG8gPHU+YWRkIGVhY2ggb25lIHRvIHlvdXIgbGF5ZXJzIGFuZCBleGFtaW5lIHRoZSBhcmVhIHN1cnJvdW5kaW5nIGNhbXB1czwvdT4uIEl0IGlzIHVwIHRvIHlvdSB0byBjaG9vc2Ugd2hpY2ggdHlwZSBvZiBpbWFnZXJ5IGlzIGJlc3QgdXNlZCBmb3IgdGhlIGRhdGEgY3JlYXRpb24gYXMgd2VsbCBhcyB0aGUgZmluYWwgbWFwIGZvciB0aGlzIGFzc2lnbm1lbnQuDQoNCk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgdGhlIGltYWdlcnkgeW91IHBsYW4gdG8gdXNlLCBjbGljayBfTGF5ZXIgPiBDcmVhdGUgTGF5ZXIgPiBOZXcgU2hhcGVmaWxlIExheWVyXyB0byBjcmVhdGUgYSBuZXcgc2hhcGVmaWxlIGRhdGFzZXQuIEluIHRoZSByZXN1bHRpbmcgd2luZG93LCBjbGljayBvbiB0aGUgYnJvd3NlIGJ1dHRvbiA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWZpbGUtbG9jYXRpb24tYnV0dG9uLmpwZyIgYWx0PSJCcm93c2UgZm9yIGZpbGUgbG9jYXRpb24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IHRvIGdpdmUgeW91ciBzaGFwZWZpbGUgYSBuZXcgbmFtZSBhbmQgc2F2ZSBpdCBpbiB5b3VyIHByb2plY3QgZm9sZGVyLiANCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1uZXctc2hhcGVmaWxlLWxheWVyLnBuZyIgYWx0PSJOZXcgU2hhcGVmaWxlIExheWVyIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpGb3IgdGhlIHJlc3Qgb2YgdGhlIG9wdGlvbnMgdXNlIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6DQoNCi0gRmlsZSBlbmNvZGluZyA9IFVURi04DQotIEdlb21ldHJ5IHR5cGUgPSBQb2ludA0KLSBBZGRpdGlvbmFsIGRpbWVuc2lvbnMgPSBOb25lLCBFUFNHOjQzMjYgLSBXR1MgODQNCi0gTmV3IEZpZWxkDQogIC0gTmFtZSA9IE5hbWUNCiAgLSBUeXBlID0gVGV4dERhdGENCiAgLSBMZW5ndGggPSA4MA0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLW5ldy1zaGFwZWZpbGUtbGF5ZXItZGlhbG9nLnBuZyIgYWx0PSJOZXcgU2hhcGVmaWxlIExheWVyIEJveCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KQmVjYXVzZSB5b3Ugd2lsbCBiZSBjcmVhdGluZyBhIHNlcmllcyBvZiBwb2ludHMgdGhlIGdlb21ldHJ5IHNob3VsZCBiZSBzZXQgdG8gcG9pbnQuIEhvd2V2ZXIsIHlvdSB3b3VsZCB0YWtlIHRoZXNlIHNhbWUgc3RlcHMgdG8gY3JlYXRlIGEgbXVsdGlwb2ludCwgbGluZSwgb3IgcG9seWdvbiBzaGFwZWZpbGUgYXMgd2VsbC4gVGhlIFVURi04IGVuY29kaW5nIGFsbG93cyBmb3IgdGhlIGRhdGFzZXQgdG8gYmUgdXNlZCBvbiBXaW5kb3dzIG9mIE1hYyBPUyBzeXN0ZW1zIHdoaWNoIGVuYWJsZXMgdGhlIHBvc3NpYmlsaXR5IG9mIHNoYXJpbmcgdGhlIGRhdGEuIEFmdGVyIGFkZGluZyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBOZXcgRmllbGQgY2xpY2sgdGhlIGJ1dHRvbiB0byAqKkFkZCB0byBGaWVsZHMgTGlzdCoqIHRvIGFkZCBhIGZpZWxkIGNhbGxlZCAiTmFtZSIgdG8geW91ciBkYXRhc2V0IGFuZCBjbGljayBPSy4NCg0KVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IGluIHlvdXIgbGF5ZXJzIHRoYXQgYWxsb3dzIHlvdSB0byBhZGQgYWRkaXRpb25hbCBwb2ludCBpbmZvcm1hdGlvbi4gV2l0aCB0aGUgbmV3IGRhdGFzZXQgc2VsZWN0ZWQsIGJlZ2luIGJ5IGVpdGhlciByaWdodC9DUlRMIGNsaWNraW5nIG9uIHRoZSBuZXcgZGF0YSBsYXllciBvciBjbGlja2luZyB0aGUgcGVuY2lsIGljb24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy10b2dnbGUtZWRpdGluZy1idXR0b24uanBnIiBhbHQ9IlRvZ2dsZSBFZGl0aW5nIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPiB0byBfVG9nZ2xlIEVkaXRpbmdfLiBUaGlzIHdpbGwgbWFrZSB0aGUgbmV3IGxheWVyIGVkaXRhYmxlLiBOZXh0LCBjbGljayBvbiB0aGUgKipBZGQgUG9pbnQgRmVhdHVyZSoqIGJ1dHRvbiA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWFkZC1wb2ludC1mZWF0dXJlLWJ1dHRvbi5qcGciIGFsdD0iQWRkIFBvaW50IEZlYXR1cmUiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IGFuZCBub3RpY2UgYXMgeW91ciBjdXJzb3IgYmVjb21lcyBhIHRhcmdldC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1lZGl0LW5ldy1zaGFwZWZpbGUucG5nIiBhbHQ9IkFkZGluZyBQb2ludCBEYXRhIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpQbGFjZSB0aGUgdGFyZ2V0IG92ZXIgdGhlIFdvb2R3YXJkIExpYnJhcnkgYnVpbGRpbmcgX3JvdWdobHlfIHdoZXJlIHRoZSBbU3RhcmJ1Y2tzXShodHRwczovL3d3dy5zdGFyYnVja3MuY29tL3N0b3JlLWxvY2F0b3Ivc3RvcmUvODcwMDUvYXVzdGluLXBlYXktc3RhdGUtdW5pdmVyc2l0eS02MDEtY29sbGVnZS1zdC1jbGFya3N2aWxsZS10bi0zNzA0NDAwMDEtdXMpIGlzIGxvY2F0ZWQgYW5kIGNsaWNrLiBJbiB0aGUgcmVzdWx0aW5nIHdpbmRvdyBnaXZlIHRoaXMgbG9jYXRpb24gYXR0cmlidXRlcyB3aGVyZSB0aGUgKippZCA9IDEqKiBhbmQgdGhlICoqTmFtZSA9IFN0YXJidWNrcyoqIGFuZCBjbGljayBPSy4gWW91IHdpbGwgbm90aWNlIGEgbmV3IHBvaW50IHRoYXQgYXBwZWFycyBvbiB0aGUgbWFwIGFuZCB5b3VyIGN1cnNvciB3aWxsIHJldHVybiB0byBhIHRhcmdldCBsaWtlIGFwcGVhcmFuY2UuIFRoaXMgY3JlYXRlZCBwb2ludCBkYXRhIHJlcHJlc2VudGluZyBTdGFyYnVja3MgYW5kIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhlIElEIGFuZCBOYW1lIHZhcmlhYmxlcy4gUmVwZWF0IHRoaXMgcHJvY2VzcyBhbmQgY3JlYXRlIHBvaW50cyBmb3IgYWxsIG9mIHRoZSBvbi1jYW1wdXMgZGluaW5nIGxvY2F0aW9ucyBhbmQgY29udmVuaWVuY2Ugc3RvcmVzICh+MTIpLiBGb3IgdGhlIElEIGZpZWxkIGNvbnRpbnVlIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgYnkgb25lIGVhY2ggdGltZSBhbmQgZm9yIHRoZSBOYW1lIGZpZWxkIHR5cGUgaW4gdGhlIG5hbWUgb2YgdGhlIGxvY2F0aW9uIHlvdSBhcmUgZGVwaWN0aW5nLiBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIHRoZSBsYXN0IGRhdGEgcG9pbnQsIGNsaWNrIHRoZSBfU2F2ZSBMYXllciBFZGl0c18gYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtc2F2ZS1sYXllci1lZGl0cy1idXR0b24uanBnIiBhbHQ9IlNhdmUgTGF5ZXIgRWRpdHMiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IGFuZCB0b2dnbGUgZWRpdGluZyBmb3IgdGhhdCBsYXllciBvZmYgYnkgY2xpY2tpbmcgdGhlIHRvZ2dsZSBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy10b2dnbGUtZWRpdGluZy1idXR0b24uanBnIiBhbHQ9IlRvZ2dsZSBFZGl0aW5nIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPi4NCg0KV2l0aCB0aGUgb24tY2FtcHVzIGxvY2F0aW9ucyBjcmVhdGVkIHlvdSBjb3VsZCBhbHNvIHVzZSB0aGUgc2FtZSBzdGVwcyB0byBjcmVhdGUgdGhlIG9mZi1jYW1wdXMgbG9jYXRpb24uIEhvd2V2ZXIsIHNvbWV0aW1lcyB5b3Ugd2lsbCBmaW5kIHRoYXQgY29sbGFib3JhdG9ycyBzZW5kIHlvdSBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBhIHNwcmVhZHNoZWV0IG9yIHNvbWUgb3RoZXIgZm9ybWF0IHN1Y2ggYXMgKiprZXlob2xlIG1hcmt1cCBsYW5nYXVnZSoqIChLTUwpIGZyb20gR29vZ2xlIEVhcnRoIG9yIGEgS01aIHdoaWNoIGlzIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIGEgS01MLiBJbiBbRXhlcmNpc2UgNSwgU3RlcCAyXShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS01LyMxMl9TdGVwX1R3bzpfVGhlX0FuYWx5c2VzKSB5b3UgbGVhcm5lZCBob3cgdG8gaW1wb3J0IGEgXCouY3N2IGZpbGUgd2l0aG91dCBnZW9tZXRyeSAobWVhbmluZyB0aGVyZSB3ZXJlIG5vIFggYW5kIFkgdmFsdWVzIGZvciBsb2NhdGlvbnMpLiBJZiB0aGUgXCouY3N2IGZpbGUgaGFzIHZhcmlhYmxlcyBmb3IgYSBsb2NhdGlvbiwgc3VjaCBhcyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG9yIFVUTSwgeW91IGNhbiBzaW1wbHkgY2hvb3NlICJQb2ludCBDb29yZGluYXRlIiBhbmQgcHJvdmlkZSB0aGUgZmllbGRzIHdoZXJlIHRoZSBYWSBkYXRhIGlzIGxvY2F0ZWQuIEhvd2V2ZXIsIHdpdGggYSB1c2VmdWwgUUdJUyBwbHVnLWluIHlvdSBoYXZlIHRoZSBhYmlsaXR5IHRvIGltcG9ydCBzb21lIGRhdGEgZGlyZWN0bHkgZnJvbSBhIFVSTCBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdC4gU2ltaWxhciB0byBbRXhlcmNpc2UgNSwgU3RlcCA0XShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS01LyMxNF9TdGVwX0ZvdXI6X1RoZV9Db3VudHlfQ29tbWlzc29uX1JlcG9ydCksIGdvIHRvICoqUGx1Z2lucyA+IE1hbmFnZSBhbmQgSW5zdGFsbCBQbHVnaW5zKiogb24gdGhlIG1lbnUgYmFyIGFuZCBzZWFyY2ggZm9yICoqTU1RR0lTKiogYW5kIGluc3RhbGwgdGhlIHBsdWctaW4uDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL21tcWdpcy1wbHVnaW4tcGFnZS5wbmciIGFsdD0iTU1RR0lTIiBzdHlsZT0id2lkdGg6ODUlIj48L3A+DQoNCk9uIHRoZSBtZW51IGJhciB5b3Ugd2lsbCBzZWUgYSBuZXcgb3B0aW9uIGZvciBNTVFHSVMgYXZhaWxhYmxlLiBDbGljayBfTU1RR0lTID4gSW1wb3J0L0V4cG9ydCA+IEdlb21ldHJ5IEltcG9ydCBmcm9tIENTViBGaWxlXyBhbmQgaW4gdGhlIHJlc3VsdGluZyB3aW5kb3cgdXNlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhbmQgY2xpY2sgYXBwbHk6DQoNCi0gSW5wdXQgQ1NWIE5vZGVzIEZpbGUgPSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vY2hyaXNtZ2VudHJ5L0dJUzEtRXhlcmNpc2UtNi9tYWluL0RhdGEvb2ZmLWNhbXB1cy1kaW5pbmcuY3N2DQotIEdlb21ldHJ5IHR5cGUgPSBQb2ludA0KLSBTaGFwZSBJRCBGaWVsZCA9IG5hbWUNCi0gUGFydCBJRCBGaWVsZCA9ICh0aGlzIHNob3VsZCBiZSBncmF5ZWQgb3V0IGFuZCBub3QgYWNjZXNzaWJsZSkNCi0gTGF0aXR1ZGUgRmllbGQgPSB5DQotIExvbmdpdHVkZSBGaWVsZCA9IHgNCi0gT3V0cHV0IEZpbGUgTmFtZSA9IEluIHRoaXMgZmllbGQgY2xpY2sgb24gdGhlIGJyb3dzZSBidXR0b24gdG8gZ2l2ZSB0aGUgbmV3IGZpbGUgYSBuYW1lIGFuZCBzYXZlIGl0IHRvIHlvdXIgcHJvamVjdCBmb2xkZXINCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvbW1xZ2lzLWltcG9ydC1kaWFsb2cucG5nIiBhbHQ9IkltcG9ydGluZyBDU1YgRmlsZSB3aXRoIE1NUUdJUyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KVGhlIHJlc3VsdGluZyBpbXBvcnQgc2hvdWxkIGhhdmUgcGxhY2VkIGFub3RoZXIgMjQgZGF0YSBwb2ludHMgb24geW91ciBtYXAuIFlvdSBjYW4gdXNlIHJpZ2h0L0NSVEwgY2xpY2sgYW5kICJab29tIHRvIExheWVyIiBvbiB0aGUgbmV3IGxheWVyIHRvIHNlZSBhbGwgb2YgdGhlIG5ldyBwb2ludHMgKGNvbG9ycyBteSB2YXJ5KS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1vZmYtY2FtcHVzLWltcG9ydC5wbmciIGFsdD0iSW1wb3J0ZWQgQ1NWIFBvaW50cyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMTwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX1doaWNoIG9uLWNhbXB1cyBsb2NhdGlvbiBpcyB0aGUgbGFzdCB0byBjbG9zZSBvbiBhIFNhdHVyZGF5IG5pZ2h0PyBXaGF0IG90aGVyIHZhcmlhYmxlcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBvZmYtY2FtcHVzIHBvaW50cyB0aGF0IHdlcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIG9uLWNhbXB1cyBkYXRhIHlvdSBjcmVhdGVkP18NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUl17c3R5bGU9ImNvbG9yOiAjNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQpCZWZvcmUgeW91IGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIG9wZW4gdGhlIFtFeDIgQ29sYWIgTm90ZWJvb2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS02L2Jsb2IvbWFpbi9HSVMxX0VYNi5pcHluYikgYW5kIGluc2VydCAqKnRvY29sYWIqKiBhZnRlciBfZ2l0aHViXyBpbiB0aGUgVVJMIHRvIG9wZW4gaW4gdGhlIF9Db2xhYiBFbnZpcm9ubWVudF8uIEFzIHlvdSBoYXZlIHNlZW4gYmVmb3JlLCBSIHJlcXVpcmVzIHZhcmlvdXMgcGFja2FnZXMgdG8gY29tcGxldGUgY2VydGFpbiBhbmFseXNlcy4gSW4gdGhpcyBleGVyY2lzZSB5b3Ugd2lsbCBiZSB1c2luZyAqKnRpZHl2ZXJzZSwgT3BlblN0cmVldE1hcHMsIGdnZm9ydGlmeSwgbWFwdG9vbHMsIGFuZCByZ2VvcyoqLiBUbyBpbnN0YWxsIGFuZCBsb2FkIHRoZSBwYWNrYWdlcyB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHNjcmlwdDoNCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDE8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQoNCiMjIFN0ZXAgVHdvOiBUaGUgQW5hbHlzZXMNCg0KV2l0aCBkYXRhc2V0cyBmb3IgYm90aCBvbi1jYW1wdXMgYW5kIG9mZi1jYW1wdXMgY3JlYXRlZCwgaW4gdGhpcyBzdGVwIHlvdSB3aWxsIGVkaXQgdGhlIGF0dHJpYnV0ZSB0YWJsZSB0byBwcm92aWRlIG9wdGlvbnMgZm9yIGNhdGVnb3JpemF0aW9ucyB3aGVuIG1ha2luZyB0aGUgZmluYWwgbWFwLg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMjwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpOb3cgdGhhdCB5b3UgaGF2ZSB5b3VyIHR3byBkYXRhc2V0cyBpdCBtYWtlcyBzZW5zZSB0byBtZXJnZSB0aGVtIGludG8gb25lIGNvbWJpbmVkIGZpbGUuIEluIHRoZSBfUHJvY2Vzc2luZyBUb29sYm94XyBvciBpbiBfVmVjdG9yID4gRGF0YSBNYW5hZ2VtZW50IFRvb2xzID4gTWVyZ2UgVmVjb3IgTGF5ZXJzXyBvbiB0aGUgbWVudSBiYXIsIG9wZW4gdGhlIHByb2Nlc3NpbmcgdG9vbCB0byBjcmVhdGUgYSBtZXJnZWQgZGF0YXNldC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1tZXJnZS5wbmciIGFsdD0iTWVyZ2UgVmVjdG9yIExheWVycyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KSW4gdGhlICoqTWVyZ2UgVmVjdG9yIExheWVycyoqIGRpYWxvZyBib3ggY2xpY2sgYnJvd3NlIGJ1dHRvbiA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWZpbGUtbG9jYXRpb24tYnV0dG9uLmpwZyIgYWx0PSJCcm93c2UgZm9yIGZpbGUgbG9jYXRpb24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IHRvIHNlbGVjdCB0aGUgaW5wdXQgbGF5ZXJzLiBVc2luZyB0aGUgc2VsZWN0IGFsbCBidXR0b24gb3IgYnkgY2hlY2tpbmcgdGhlIGJveGVzIG5leHQgdG8gZWFjaCBsYXllciwgc2VsZWN0IHRoZSBvbiBhbmQgb2ZmIGNhbXB1cyBkYXRhc2V0cyBhbmQgY2xpY2sgdGhlIF9HbyBCYWNrXyBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1nby1iYWNrLWJ1dHRvbi5qcGciIGFsdD0iR28gQmFjayBCdXR0b24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IHRvIHJldHVybiB0byB0aGUgbWFpbiBtZXJnZSBtZW51LiBUbyBzYXZlIHRoZSBkYXRhc2V0IGFzIGEgcGVybWFuZW50IGZpbGUgY2xpY2sgdGhlIGJyb3dzZSBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1maWxlLWxvY2F0aW9uLWJ1dHRvbi5qcGciIGFsdD0iQnJvd3NlIGZvciBmaWxlIGxvY2F0aW9uIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPiBpbiB0aGUgX01lcmdlZF8gb3B0aW9uIGFuZCBzZWxlY3QgIlNhdmUgdG8gRmlsZS4uLiIgUmVtZW1iZXIgdG8gc2F2ZSBpdCBpbiB5b3VyIHByb2plY3QgZm9sZGVyLg0KDQpXaXRoIHRoZSBuZXdseSBtZXJnZWQgZGF0YXNldCBhZGRlZCB0byB5b3VyIGxheWVycywgb3BlbiB0aGUgYXR0cmlidXRlIHRhYmxlIHRvIGV4YW1pbmUgdGhlIG91dHB1dC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1tZXJnZWQtYXR0cmlidXRlLXRhYmxlcy5wbmciIGFsdD0iTWVyZ2UgVmVjdG9yIExheWVyIEF0dHJpYnV0ZSBUYWJsZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KTm90aWNlIHRoYXQgdGhlIHZhcmlhYmxlcyBmcm9tIGVhY2ggZGF0YXNldCBhcmUgbm93IGluY2x1ZGVkIGluIHRoZSBmdWxsIHRhYmxlLiBIb3dldmVyLCBiZWNhdXNlIGVhY2ggYXR0cmlidXRlIHRhYmxlIGhhZCB2YXJ5aW5nIGRhdGEgc29tZSBvZiB0aGUgY2VsbHMgYXJlIGZpbGxlZCB3aWxsIF9OVUxMXyB2YWx1ZXMuIFRvIGVkaXQgdGhlc2UgdmFsdWVzIGNsaWNrIG9uIHRoZSB0b2dnbGUgZWRpdGluZyBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy10b2dnbGUtZWRpdGluZy1idXR0b24uanBnIiBhbHQ9IlRvZ2dsZSBFZGl0aW5nIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPiA8dT5vbiB0aGUgYXR0cmlidXRlIHRhYmxlPC91PiBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBjbGljayB3aXRoaW4gZWFjaCBfTlVMTF8gdmFsdWUgY2VsbCBhbmQgZWRpdCB0aGUgaW5mb3JtYXRpb24uIEZvciB0aGlzIGV4ZXJjaXNlIGZvY3VzIG9uIGNvbXBsZXRpbmcgdGhlIElEIChzaW1wbHkgbnVtYmVyIHRoZW0gMS0zNiksIGxvY2F0aW9uIChvZmYtY2FtcHVzIG9yIG9uLWNhbXB1cyksIGhvdXJzLCBhbmQgaG91cnNfY2F0ZSAoc2hvcnQgZm9yIGNhdGVnb3J5KSBjb2x1bW5zLiBUaGUgWCBhbmQgWSBjb2x1bW5zIGFyZSBjb21wbGV0ZWQgZm9yIHRoZSBvZmYtY2FtcHVzIGxvY2F0aW9ucyBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiB3YXMgaW5jbHVkZWQgaW4gdGhlIGluaXRpYWwgXCouY3N2IGZpbGUuIFdoZW4geW91IGNyZWF0ZWQgdGhlIG9uLWNhbXB1cyBsb2NhdGlvbnMgdGhhdCBkYXRhIGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVjb3JkZWQgaW4gdGhlIGF0dHJpYnV0ZSB0YWJsZS4gU28gZG9uJ3Qgd29ycnkgYWJvdXQgYWRkaW5nIHRoYXQgaW5mb3JtYXRpb24gaW50byB0aGUgdGFibGUgYXMgaXQgaXMgdmVyeSB1bmxpa2VseSBpdCB3aWxsIGJlIHVzZWZ1bCBmb3IgdGhlIHZpc3VhbGl6YXRpb24uDQoNCklmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIGZpZWxkIHRvIHByb3ZpZGUgZnVydGhlciBkYXRhIGFib3V0IHRoZSBsb2NhdGlvbnMgKHR5cGUgb2YgZm9vZCwgZGluaW5nIGF0bW9zcGhlcmUsIGV0Yy4pIHlvdSBjYW4gY2xpY2sgdGhlICoqTmV3IEZpZWxkKiogYnV0dG9uIHdoaWxlIGVkaXRpbmcgaXMgdG9nZ2xlZCBvbiBpbiB0aGUgYXR0cmlidXRlIHRhYmxlIHRvIG1ha2UgYSBuZXcgZmllbGQuIEluIHRoZSB3aW5kb3cgZ2l2ZSB0aGUgZmllbGQgYSBfbmFtZV8sIF90eXBlXyBzdWNoIGFzIGludGVnZXIsIGRlY2ltYWwsIHRleHQsIGRhdGUsIGV0Yy4sIF9sZW5ndGhfIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgImNoYXJhY3RlcnMiIGZvciBhbnkgbm9uIHRleHQgb3IgaW50ZWdlciB2YWx1ZSwgYW5kL29yIF9wcmVjaXNpb25fIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcGxhY2VzIHRvIHRoZSByaWdodCBvZiB0aGUgZGVjaW1hbC4gVGhpbmsgYWJvdXQgY2F0ZWdvcmllcyB5b3UgY2FuIGNyZWF0ZSB0aGF0IG1pZ2h0IGJlIHVzZWZ1bCBpbiB5b3VyIHZpc3VhbGl6YXRpb24uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDI8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9CYXNlZCBvbiAgZGF0ZSBpbiB0aGUgYXR0cmlidXRlIHRhYmxlLCBob3cgbWFueSBsb2NhdGlvbnMgd291bGQgbm90IGJlIGFuIG9wdGlvbiBhdCAzcG0gdGhpcyBhZnRlcm5vb24/Xw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgRGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjojNjQ5NUVEIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDI8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQoNCiMjIFN0ZXAgVGhyZWU6IFRoZSBWaXN1YWxpemF0aW9uDQoNCkluIHRoaXMgc3RlcCB5b3Ugd2lsbCB1c2UgcHJldmlvdXMgZXhhbXBsZXMgYW5kIHlvdXIgb3duIGRlc2lnbiBjb25jZXB0cyB0byBjcmVhdGUgYSB2aXN1YWxpemF0aW9uIHRoYXQgY2FuIGJlIGRpc3RyaWJ1dGVkIGJ5IEFQU1UgRGluaW5nIFNlcnZpY2VzIHRvIHN0dWRlbnRzIGFzIHBhcnQgb2YgdGhlaXIgIldlbGNvbWUgdG8gQ2FtcHVzIiBwYWNrZXQgd2hlbiB0aGV5IGFycml2ZSBpbiB0aGUgZmFsbC4gWW91IG1heSBuZWVkIHRvIHVzZSB2YXJpb3VzIGluc2V0IG1hcHMgb3Igb3RoZXIgbWV0aG9kcyB0byBlbnN1cmUgYWxsIGxvY2F0aW9ucyBjYW4gYmUgdmlld2VkLg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAzPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KVW5saWtlIHByZXZpb3VzIGV4ZXJjaXNlcywgdGhlcmUgd2lsbCBub3QgYmUgYW4gZXhhbXBsZSBwcm92aWRlZCBvZiBob3cgdGhpcyBtYXAgY291bGQgYmUgbWFkZS4gQmVjYXVzZSB0aGVyZSBpcyBhIGxhcmdlIG51bWJlciBhbmQgdmFyaWV0eSBvZiBkYXRhIHBvaW50cyB5b3Ugd2lsbCBuZWVkIHRvIHRoaW5rIGFib3V0IGhvdyB0byBjcmVhdGUgdGhlIG1vc3QgdXNlZnVsIHZpc3VhbGl6YXRpb24gcG9zc2libGUgZm9yIGRpbmluZyBzZXJ2aWNlcy4gSG93ZXZlciwgaW4gW0V4ZXJjaXNlIDQsIFN0ZXAgNF0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTRfU3RlcF9Gb3VyOl9Zb3VyX1R1cm4pIHlvdSB1c2VkIGEgbW9yZSBhZHZhbmNlZCBsYWJlbGluZyBmZWF0dXJlIHRvIGZpbHRlciBvdXQgYW5kIGFkZCBsYWJlbHMgdG8gc3BlY2lmaWMgbG9jYXRpb25zIHRvIHRoZSBtYXAuIFRoaXMgcHJvY2VzcyBza2lwcGVkIG92ZXIgdGhlIGJhc2ljIHN0ZXBzIGZvciBsYWJlbGluZyBkYXRhLiBXaGlsZSB5b3UgY291bGQgdXNlIHRoZSBtb3JlIGFkdmFuY2UgcnVsZS1iYXNlZCBsYWJlbGluZyBmb3IgdGhpcywgaGVyZSBpcyBob3cgeW91IHByb2R1Y2UgYmFzaWMgbGFiZWxzIGZvciBhIGdpdmVuIGRhdGFzZXQuIA0KDQpSaWdodC9DUlRMIGNsaWNrIG9uIHRoZSBkYXRhc2V0IHlvdSB3aXNoIHRvIGxhYmVsIGNhbiBzZWxlY3QgdGhlIHByb3BlcnRpZXMgbWVudS4gTmF2aWdhdGUgdG8gdGhlIExhYmVscyB0YWIgb24gdGhlIGxlZnQgYW5kIHNlbGVjdCAqKlNpbmdsZSBMYWJlbHMqKiBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBhdCB0aGUgdG9wIG9mIHRoZSB3aW5kb3cuIA0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWxhYmVsaW5nLW9wdGlvbnMucG5nIiBhbHQ9IlNpbmdsZSBMYWJlbHMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNClRoaXMgd2lsbCBwcm92aWRlIGEgbnVtYmVyIG9mIG9wdGlvbnMgZm9yIGxhYmVsIGN1c3RvbWl6YXRpb25zIG9uY2UgeW91IHNlbGVjdCB0aGUgKipWYWx1ZSoqIG9yIHRoZSBmaWVsZCB5b3Ugd2FudCB0byBiZSB1c2VkIGZvciB0aGUgbGFiZWxzLiBJbiB0aGlzIGNhc2UgeW91IHdhbnQgdG8gc2VsZWN0IF9uYW1lXy4gTm93IHlvdSBjYW4gbW92ZSB0aHJvdWdoIHRoZSB2YXJpb3VzIG9wdGlvbnMgb24gdGhlIGxlZnQgc3VjaCBhcyBfdGV4dF8sIF9mb3JtYXR0aW5nXywgX2J1ZmZlcl8sIF9tYXNrXywgX2JhY2tncm91bmRfLCBfc2hhZG93XywgZXRjLiB0byBkZXNpZ24gYSBzdHlsZSBvZiBsYWJlbGluZyB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciBkaXNwbGF5IG9uIHlvdXIgbWFwLg0KDQpPbmUgbGFzdCBvcHRpb24gZm9yIHRoaXMgdmlzdWFsaXphdGlvbiBpcyB0byBjaGFuZ2UgdGhlIG9wYWNpdHkgb2YgdGhlIGJhY2tncm91bmQgaW1hZ2VyeS4gRGVwZW5kaW5nIG9uIHRoZSBiYWNrZ3JvdW5kIHRoYXQgd2FzIHNlbGVjdGVkLCB0aGUgaW50ZW5zaXR5IG9yIHZhcmlhdGlvbiBpbiB0aGUgY29sb3Igb3IgdGV4dHVyZSBjYW4gbWFrZSBpdCBkaWZmaWN1bHQgdG8gdmlzdWFsaXplIHNvbWUgb3ZlcmxheXMuIEJ5IHJpZ2h0L0NSVEwgY2xpY2tpbmcgb24gdGhlIGJhY2tncm91bmQgaW1hZ2VyeSBsYXllciBhbmQgc2VsZWN0aW5nICoqVHJhbnNwYXJlbmN5KiogeW91IGNhbiBjaGFuZ2UgdGhlIF9HbG9iYWwgT3BhY2l0eV8gdmFsdWUgdG8gYWRqdXN0IGhvdyB0aGUgbGF5ZXIgaXMgZGlzcGxheWVkLiBUaGlzIG1pZ2h0IGhlbHAgd2l0aCB0aGUgbGVnaWJpbGl0eSBvZiB0aGUgbGFiZWxzLg0KDQpCZWNhdXNlIG9mIHRoZSBkaWZmaWN1bHRpZXMgd2l0aCBsYWJlbCBvcmdhbml6YXRpb24gb24gdmFyaW91cyBtYXBzLCBzb21lIGNhcnRvZ3JhcGhlcnMgcHJlZmVyIHRvIG1hbnVhbGx5IGxhYmVsIGl0ZW1zIHNvIHRoZWlyIHByZWNpc2UgcG9zaXRpb25pbmcgY2FuIGJlIGNvbnRyb2xsZWQgYmV0dGVyIHRoYW4gaWYgcGxhY2VkIGJ5IHRoZSBzb2Z0d2FyZS4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMzwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0J5IGNoYW5naW5nIHRoZSBsYWJlbGluZyBvcHRpb25zLCBkZXNjcmliZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgKiptYXNrKiogYW5kICoqYnVmZmVyKiogZG8uXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMzwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCg0KIyMgU3RlcCBGb3VyOiBDdWxpbmFyeSBDYXJ0b2dyYXBoeQ0KDQpBZnRlciByZXZpZXdpbmcgdGhlIGluZm9ybWF0aW9uIHlvdSBoYXZlIGNvbGxlY3RlZCB3aXRoIHRoZSBBUFNVIERpbmluZyBTZXJ2aWNlcyBEaXJlY3RvciwgdGhleSBoYXZlIGdpdmVuIHlvdSBmdWxsIGNvbnRyb2wgb2YgdGhlIGZpbmFsIGRlc2lnbiBvZiB0aGUgbWFwIGJ1dCBhc2tlZCB0aGF0IHlvdSBpbmNsdWRlIGFuZCBBUFNVIGxvZ28gb24gdGhlIG1hcC4gVG8gZG93bmxvYWQgb2ZmaWNpYWwgbG9nb3MgZm9yIHRoZSB1bml2ZXJzaXR5IHlvdSBtdXN0IGdvIGRvIFtodHRwOi8vYXNwaXJlLmFwc3UuZWR1XShodHRwOi8vYXNwaXJlLmFwc3UuZWR1KSBhbmQgY2xpY2sgdGhlIGxvZ2luIGxpbmsgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gVXNpbmcgdGhlIEFQU1UgTG9naW4gbGluaywgZW50ZXIgeW91ciBPbmVTdG9wIHVzZXJuYW1lL3Bhc3N3b3JkIGFuZCBjbGljayBsb2dpbi4gT24gdGhlIEFTUElSRSBIb21lcGFnZSBjbGljayB0aGUgbGluayBmb3IgUHVibGljIFJlbGF0aW9ucyBhbmQgTWFya2V0aW5nIHVuZGVyIHRoZSBDb21tdW5pdGllcyBoZWFkaW5nIGluIHRoZSBjZW50ZXIgb2YgdGhlIHBhZ2UuIFVuZGVyICJSZWNlbnQgU3VibWlzc2lvbnMiIHlvdSB3aWxsIGZpbmQgYSBudW1iZXIgb2YgZGlmZmVyZW50IGxvZ29zIHRvIGNob29zZSBmcm9tLiBTZWxlY3QgdGhlIG9uZSB5b3Ugd291bGQgbGlrZSB0byB1c2UgYW5kIGNsaWNrIG9uIHRoZSBsaW5rLiBGaW5hbGx5IHNlbGVjdCBlaXRoZXIgdGhlIEpQRUcgb3IgUE5HIHZlcnNpb24gb2YgdGhlIGxvZ28gYW5kIHJpZ2h0L0NSVEwgY2xpY2sgb24gdGhlIGNvcnJlc3BvbmRpbmcgdmlldy9vcGVuIGxpbmsgdG8gZG93bmxvYWQgdG8geW91ciBwcm9qZWN0IGZvbGRlci4gT25jZSB5b3UgaGF2ZSB0aGUgbG9nbyB5b3UgY2FuIGxvZyBvdXQuDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDQ8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6IzAwNjQwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpBbHRob3VnaCB0aGUgZmluYWwgZGVzaWduIG9mIHRoZSBkaW5pbmcgbWFwIHdpbGwgYmUgdXAgdG8geW91LCB0aGVyZSBhcmUgYSBjb3VwbGUgdGVjaG5pcXVlcyB3aGljaCBtaWdodCBiZSBoZWxwZnVsIGluIHRyeWluZyB0byB2aXN1YWxseSBvcmdhbml6ZSB0aGUgZGF0YSBvbiB0aGUgbGF5b3V0IHNjcmVlbi4gSW4gW0V4ZXJjaXNlIDQsIFN0ZXAgM10oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTNfU3RlcF9UaHJlZTpfVGhlX1Zpc3VhbGl6YXRpb24pIHlvdSBsZWFybmVkIGhvdyB0byBjcmVhdGUgYW4gaW5zZXQgbWFwIHRoYXQgcHJvdmlkZWQgYSBzbWFsbCBzY2FsZSB2aWV3IG9mIHRoZSBkYXRhc2V0LiBJbnNldHMgY2FuIGFsc28gYmUgdXNlZCB0byB2aWV3IGNsdXN0ZXJlZCBkYXRhIGluIGEgbGFyZ2Ugc2NhbGUgdmlldy4gRm9yIGV4YW1wbGUsIGluIHRoZSBzYW1wbGUgaW1hZ2VzIGFib3ZlIHlvdSBjYW4gc2VlIGEgZmV3IGRpc3RpbmN0IGRpbmluZyBjbHVzdGVycyB0aGF0IGNvdWxkIGJlIHBsYWNlZCBpbiBhIGxhcmdlciBzY2FsZSBpbnNldCB0byBwcm92aWRlIGFkZGl0aW9uYWwgbGVnaWJpbGl0eS4gRm9sbG93aW5nIHNpbWlsYXIgc3RlcHMgdG8gW0V4ZXJjaXNlIDQsIFN0ZXAgM10oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTNfU3RlcF9UaHJlZTpfVGhlX1Zpc3VhbGl6YXRpb24pIHlvdSBjYW4gY3JlYXRlIGFuIGluc2V0IGZvciB0aGUgbG9jYXRpb25zIGFsb25nIFVuaXZlcnNpdHkgQXZlLiBJbiB0aGlzIGNhc2UsIGJlY2F1c2UgdGhlIGluc2V0IGlzIGF0IGEgbGFyZ2VyIHNjYWxlIHRoYW4gdGhlIHByaW1hcnkgbWFwLCB5b3UgY2FuIGhhdmUgW1FHSVNde3N0eWxlPSJjb2xvcjojMDA2NDAwIn0gY3JlYXRlIGFuICoqb3ZlcnZpZXcqKiB0byBoaWdobGlnaHQgdGhlIGluc2V0IGxvY2F0aW9uLg0KDQpBZnRlciBjcmVhdGluZyB0aGUgbGFyZ2Ugc2NhbGUgaW5zZXQgb24geW91ciBsYXlvdXQsIHJpZ2h0L0NSVEwgY2xpY2sgb24gdGhlIHByaW1hcnkgbWFwIGFuZCBzZWxlY3QgX0l0ZW0gUHJvcGVydGllc18uIFNjcm9sbCBkb3duIHRvICoqT3ZlcnZpZXdzKiogYW5kIGNsaWNrIHRoZSBkcm9wLWRvd24gYXJyb3cuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtb3ZlcnZpZXdzLnBuZyIgYWx0PSJDcmVhdGluZyBPdmVydmlld3MiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCldpdGggX092ZXJ2aWV3XyBvcGVuLCBjbGljayB0aGUgZ3JlZW4gcGx1cyBidXR0b24gYW5kIHNlbGVjdCB5b3VyIG1hcCBpbnNldCBtYXAuIFdpdGggdGhlIGRyYXcgb3ZlcnZpZXcgYm94IGNoZWNrZWQgeW91IHNob3VsZCBzZWUgYSBoaWdobGlnaHRlZCBhcmVhIG9uIHRoZSBwcmltYXJ5IG1hcCBvZiB3aGVyZSB0aGUgaW5zZXQgaXMgbG9jYXRlZC4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtb3ZlcnZpZXctbWFwLnBuZyIgYWx0PSJPdmVydmlldyBNYXAgU3R5bGluZyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KSWYgeW91IHdlcmUgdG8gY3JlYXRlIG11bHRpcGxlIG92ZXJ2aWV3cyB5b3UgY291bGQgc2ltcGx5IGFkZCBzb21lIGlkZW50aWZ5aW5nIHRleHQgbGlrZSBhIGNhcGl0YWwgbGV0dGVyIEEgaW4gbWF0Y2hpbmcgYm94ZXMgYW5kIEIgaW4gdGhlIHNlY29uZCBib3hlcyBvciBjcmVhdGUgc29tZSBvdGhlciB3YXkgdG8gaWRlbnRpZnkgd2hpY2ggaW5zZXQgY29ubmVjdHMgdG8gd2hpY2ggYXJlYS4gDQoNCkFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIHRpbWVzIHlvdSBtYXkgd2FudCB0byBhZGQgYSB0YWJsZSB0byB5b3VyIG1hcC4gU3VwcG9zZSB5b3Ugd291bGQgd2FudCB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0YWJsZSBpbmZvcm1hdGlvbiB0byB0aGUgaW5zZXQgeW91IGp1c3QgY3JlYXRlZCB0byB1c2UgdGhlIElEcyBhcyB0aGUgbG9jYXRpb24gaW5kaWNhdG9ycyBhbmQgYWxsb3cgdGhlIHVzZXJzIHRvIHNjYW4gdGhlIHRhYmxlIGZvciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IGNsaWNraW5nIHRoZSAqKkFkZCBhdHRyaWJ1dGUgdGFibGUqKiBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1hZGQtYXR0cmlidXRlLXRhYmxlLWJ1dHRvbi5qcGciIGFsdD0iQWRkIGF0dHJpYnV0ZSB0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj4gaW4gdGhlIGxheW91dCBhbmQgZHJhd2luZyBhIHNxdWFyZSBvbiB0aGUgbWFwLiBPbmNlIGxvYWRlZCB0aGUgZW50aXJlIGF0dHJpYnV0ZSB0YWJsZSB3aWxsIG92ZXJ3aGVsbSB0aGUgbWFwLiBIb3dldmVyLCB0aGlzIGNhbiBiZSBhZGp1c3RlZCBieSBzZWxlY3RpbmcgdGhlIGF0dHJpYnV0ZSB0YWJsZSBhbmQgb3BlbmluZyB0aGUgaXRlbSBwcm9wZXJ0aWVzLg0KDQpXaXRoIHRoZSBTb3VyY2Ugc2V0IGFzICJMYXllciBGZWF0dXJlcyIgYW5kIHRoZSBMYXllciBzZXQgYXMgdGhlIG1lcmdlZCBkYXRhc2V0IHlvdSBjcmVhdGVkIGFib3ZlIHlvdSBzaG91bGQgYmUgYWJsZSB0byBjbGljayB0aGUgKipBdHRyaWJ1dGVzLi4uKiogdG8gb3BlbiBhIF9TZWxlY3QgQXR0cmlidXRlc18gd2luZG93LiBVc2luZyB0aGUgdXAsIGRvd24sIGFkZCwgYW5kIHJlbW92ZSBib3hlcyB5b3UgY2FuIHNlbGVjdCB0aGUgZGF0YSB5b3Ugd291bGQgbGlrZSB0byByZW1vdmUgZnJvbSB0aGUgbWFwIHRhYmxlIG9yIGFkZCBhZGRpdGlvbmFsIHJvd3MuIE5leHQgeW91IG5lZWQgdG8gY2xpY2sgdGhlIGJveCBmb3IgIlNob3cgb25seSBmZWF0dXJlcyB2aXNpYmxlIHdpdGhpbiBhIG1hcCIgYW5kIHNlbGVjdCB5b3VyIGluc2V0IGluIHRoZSBsaW5rZWQgbWFwIG9wdGlvbnMuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtYWRkLXRhYmxlLW9wdGlvbnMucG5nIiBhbHQ9IkFkZCBUYWJsZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KT25jZSB5b3UgaGF2ZSB0aGUgZGF0YSBsaW5rZWQsIHlvdSBjYW4gc2Nyb2xsIGRvd24gYW5kIGFkanVzdCBhbGwgb2YgdGhlIG9wdGlvbnMgdG8gZm9ybWF0IHRoZSB0YWJsZSB0byBmaXQgeW91ciBkZXNpZ24gYmVmb3JlIGNsb3NpbmcgdGhlIGl0ZW0gcHJvcGVydGllcy4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy10YWJsZS1hZGRlZC5wbmciIGFsdD0iVGFibGUgU3R5bGluZyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KV2hpbGUgdGFibGVzIGFyZSBub3QgcmVxdWlyZWQgYW5kIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSwgdGhleSBjYW4gYmUgdXNlZCB0byBoZWxwIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGRhdGEgdGhhdCBjYW5ub3QgYmUgZGlzcGxheWVkIHRocm91Z2ggbGFiZWxzLiBIb3dldmVyLCB0aGVyZSBhcmUgYWx3YXlzIHdheXMgdG8gY3JlYXRlIHN5bWJvbG9neSB0aGF0IGNhbiBob2xkIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2ltdWx0YW5lb3VzbHkgYXMgZGlzY3Vzc2VkIGluIGxlY3R1cmUuDQoNCkZpbmFsbHksIHRvIGFkZCB0aGUgQVBTVSBsb2dvIHRvIHlvdXIgbGF5b3V0LCBjbGljayB0aGUgKipBZGQgUGljdHVyZSoqIGJ1dHRvbiA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWFkZC1pbWFnZS1idXR0b24ucG5nIiBhbHQ9IkFkZCBwaWN0dXJlIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPiBhbmQgZHJhdyBhIHNxdWFyZSBvbiB0aGUgbWFwIHRvIHBsYWNlIHRoZSBvYmplY3QuIE9wZW4gdGhlIGl0ZW0gcHJvcGVydGllcyB0byBtYWtlIGFueSBuZWNlc3NhcnkgYWRqdXN0bWVudHMuDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDQ8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9PbiBhIG1hcCB3aXRoIHRoZSBwcmltYXJ5IGFzIGxhcmdlIHNjYWxlIGFuZCB0aGUgaW5zZXQgYXMgc21hbGwgc2NhbGUgd2hpY2ggbWFwIHdvdWxkIHlvdSBzZWxlY3QgdG8gc2V0IHRoZSBvdmVydmlldz9fDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjojNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiA0PC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIFRoZSBXcml0ZS1VcA0KDQpJbiB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtYXAgeW91IHByb3ZpZGUgdG8gdGhlIEFQU1UgRGluaW5nIFNlcnZpY2VzIERpcmVjdG9yIHBsZWFzZSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQoNCi0gRGlzY3VzcyB0aGUgY2hhbGxlbmdlcyB5b3UgZW5jb3VudGVyZWQgbWFwcGluZyB0aGUgZGF0YS4NCi0gRGVzY3JpYmUgd2hhdCBpbmZvcm1hdGlvbiB0aGF0IHdhcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIChpZiBhbnkpIHRoYXQgY291bGQgaGF2ZSBoZWxwZWQgeW91IGNyZWF0ZSBhIGJldHRlciBwcm9kdWN0Lg0KDQpXaGVuIGNvbXBsZXRlLCBzZW5kIGEgbGluayB0byB5b3VyIF9Db2xhYiBOb3RlYm9va18gb3Igd29yZCBkb2N1bWVudCB3aXRoIGFuc3dlcnMgdG8gUXVlc3Rpb25zIDEtNCwgdGhlIHdyaXRlLXVwLCBhbmQgeW91ciBjb21wbGV0ZWQgbWFwIHZpYSBlbWFpbC4=